package org.young.common.listener;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import org.young.common.annotation.BaseService;
import org.young.common.base.BaseInterface;

import java.lang.reflect.Method;
import java.util.Map;

/**
 * spring容器初始化完成事件
 * Created LMHD.TEC on 2017/1/7.
 */
@Component
public class ApplicationContextListener implements ApplicationListener<ContextRefreshedEvent> {

	protected static final Logger _log = LogManager.getLogger(ApplicationContextListener.class);

	@Override
	public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
		// root application context
		if (null == contextRefreshedEvent.getApplicationContext().getParent()) {
			_log.debug(">>>>> spring初始化完毕 <<<<<");
			// spring初始化完毕后，通过反射调用所有使用BaseService注解的initMapper方法
			Map<String,Object> baseServices = contextRefreshedEvent.getApplicationContext().getBeansWithAnnotation(BaseService.class);
			for (Object service : baseServices.values()) {
				_log.debug(">>>>> {}.initMapper()", service.getClass().getName());
				try {
					Method initMapper = service.getClass().getMethod("initMapper");
					initMapper.invoke(service);
				} catch (Exception e) {
					_log.error("初始化BaseService的initMapper方法异常", e);
					e.printStackTrace();
				}
			}
			// 系统入口初始化
			Map<String,BaseInterface> baseInterfaceBeans = contextRefreshedEvent.getApplicationContext().getBeansOfType(BaseInterface.class);
			for (Object service : baseInterfaceBeans.values()) {
				_log.debug(">>>>> {}.init()", service.getClass().getName());
				try {
					Method init = service.getClass().getMethod("init");
					init.invoke(service);
				} catch (Exception e) {
					_log.error("初始化BaseInterface的init方法异常", e);
					e.printStackTrace();
				}
			}
		}
	}
}
